/*
 * ISerializable.h
 *
 */

#ifndef ISERIALIZABLE_H_
#define ISERIALIZABLE_H_

#include "tinyxml/tinyxml.h"
#include "StrUtils.h"

class SerializationException : public std::exception {
	public:
		explicit SerializationException(const std::string& msg) throw();
		virtual ~SerializationException() throw() {}
		virtual const char* what() const throw();
	private:
		std::string msg;
};

class ISerializable {
	public:
		virtual ~ISerializable() {
		}

		/**
		 * Devuelve un nuevo elemento con un nombre y un dato.
		 * Este elemento esta compuesto por un nodo del tipo elemento
		 * el cual contiene un hijo del tipo elemento texto
		 */
		static TiXmlElement* NewField(const char* name, const char* value);

		template < typename T >
		static TiXmlElement* NewField(const char* name, const T& value) {
			return NewField(name, StrUtils::toString<T>(value).c_str());
		}

		template < typename T >
		T GetField(TiXmlElement* elem, const char* name) {
			return StrUtils::fromString<T>(GetField(elem, name));
		}

		/**
		 * Devuelve el dato del campo bajo el nombre pasado por parametro
		 */
		static const char* GetField(TiXmlElement* elem, const char* name);
};

#endif /* ISERIALIZABLE_H_ */
